package com.obelisco.vista.seguridad;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.SplitPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.layout.SplitPaneLayoutData;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Button;
import nextapp.echo2.app.ResourceImageReference;

import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.Transaccion;
import com.obelisco.modelo.servicios.seguridad.IServicioAdministrarCarpetas;
import com.obelisco.modelo.servicios.seguridad.ServicioAdministrarCarpetas;
import com.obelisco.vista.componentes.BotonesDialogo;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ComponenteTransaccionDatosListener;
import com.obelisco.vista.componentes.DialogoError;
import com.obelisco.vista.componentes.DialogoMensaje;
import com.obelisco.vista.componentes.PaneTransaccionBase;
import com.obelisco.vista.componentes.TipoAccion;
import com.obelisco.vista.componentes.TipoDialogo;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.inicio.Aplicacion;
import com.obelisco.vista.plantillas.VentanaDialogoListener;
import com.obelisco.vista.seguridad.ArbolSeguridad;
import com.obelisco.vista.util.BarraHerramientasHelper;

import echopointng.ContentPaneEx;
import echopointng.ExtentEx;
import echopointng.layout.DisplayLayoutData;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.layout.RowLayoutData;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;

public class PaneTransaccionesSistema extends PaneTransaccionBase implements ComponenteTransaccionDatosListener {

	private ResourceBundle resourceBundle;

	private IServicioAdministrarCarpetas servicioAdministrarCarpetas;

	private PaneDatosBase panelDatos;

	protected DialogoMensaje dialogo;

	/**
	 * Creates a new <code>PaneTransaccionesSistema</code>.
	 */
	public PaneTransaccionesSistema() {
		super();

		// Add design-time configured components.
		initComponents();

	}

	public IServicioAdministrarCarpetas getServicioAdministrarCarpetas() {
		return servicioAdministrarCarpetas;
	}

	public void setServicioAdministrarCarpetas(
			IServicioAdministrarCarpetas servicioAdministrarCarpetas) {
		this.servicioAdministrarCarpetas = servicioAdministrarCarpetas;
	}

	public void onCancelar() {
		// TODO Auto-generated method stub
		this.salir();
	}

	public void onConfirmarCambios(Object objeto, TipoFuncion tipo,
			String nombre) {
		// TODO Auto-generated method stub
		servicioAdministrarCarpetas.guardarCarpeta(raiz);
		this.salir();
	}

	public void onConfirmarEliminacion(Object object) {
		// TODO Auto-generated method stub

	}

	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub

	}

	public void onCrear() {
		// TODO Auto-generated method stub

	}

	public void onFuncionPersonalizada(Object objeto, TipoFuncion funcion,
			String nombre) {
		// TODO Auto-generated method stub

	}

	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub

	}

	private CarpetaTransaccion raiz;

	public void onInicializar() {
		// TODO Auto-generated method stub
		this.mostrarSalir(true);
		raiz = servicioAdministrarCarpetas.buscarArbol();
		this.arbolSeguridad.addEjecutarListener(eventoEjecutar);
		this.arbolSeguridad.setRaiz(raiz);
		this.cambiarFuncion(raiz, TipoFuncion.MODIFICAR,
				BarraHerramientasHelper.getFuncion(TipoFuncion.MODIFICAR)
						.getNombre());

	}

	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub

	}

	public void onObjetoEntidad(Object objeto) {
		// TODO Auto-generated method stub

	}

	public boolean onValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub
		return true;
	}

	private DialogoTipoTransaccion dialogoTipoTransaccion = new DialogoTipoTransaccion(
			"Tipo de Elemento");

	private VentanaDialogoListener eventoDialogoTipoTransaccion = new VentanaDialogoListener() {

		public void salir(TipoAccion accion) {
			// TODO Auto-generated method stub
			if (accion == TipoAccion.ACEPTAR) {
				if (dialogoTipoTransaccion.getTipoTransaccion().equals(
						"Carpeta")) {
					CarpetaTransaccion carpeta = servicioAdministrarCarpetas
							.nuevaCarpeta(padreActual);
					panelDatos.onIncluirObjeto(carpeta);
				} else if (dialogoTipoTransaccion.getTipoTransaccion().equals(
						"Transaccion")) {
					Transaccion transaccion = servicioAdministrarCarpetas
							.nuevaTransaccion(padreActual);
					panelDatos.onIncluirObjeto(transaccion);
				}
			}
		}

	};

	private PaneDatosListener eventoPaneDatos = new PaneDatosListener() {

		public void activarCambios(TipoFuncion funcion, String nombre) {
			// TODO Auto-generated method stub

		}

		public void onCancelar() {
			// TODO Auto-generated method stub

		}

		public void onConfirmarCambios() {
			// TODO Auto-generated method stub
			arbolSeguridad.setRaiz(raiz);
		}

		public void onObjetoEntidad(Object objeto) {
			// TODO Auto-generated method stub

		}

	};

	private void onIncluir(ActionEvent e) {
		// TODO Implement.
		// Cuando es Incluir se Debe Preguntar que tipo de Objeto es,
		// Transaccion o Carpeta
		dialogoTipoTransaccion
				.removeVentanaDialogoListener(eventoDialogoTipoTransaccion);
		dialogoTipoTransaccion
				.addVentanaDialogoListener(eventoDialogoTipoTransaccion);
		dialogoTipoTransaccion.setAlto(200);
		dialogoTipoTransaccion.setAncho(350);
		dialogoTipoTransaccion.mostrarDialogo();
	}

	private void onEditar(ActionEvent e) {
		// TODO Implement.
		panelDatos.activarCambios(TipoFuncion.MODIFICAR,
				BarraHerramientasHelper.getFuncion(TipoFuncion.MODIFICAR)
						.getNombre());
	}

	private CarpetaTransaccion padreActual;

	private Object nodoActual;

	private ActionListener manejadorEventoBoton = new ActionListener() {

		public void actionPerformed(ActionEvent evento) {
			if (evento.getActionCommand() == "SI") {
				if (nodoActual instanceof CarpetaTransaccion) {
					CarpetaTransaccion carpeta = (CarpetaTransaccion) nodoActual;
					if (carpeta.getNivel() == 0) {
						DialogoError.mostrar("Error", "NO Puede eliminar el Nodo Raiz del Sistema");
					} else {
						carpeta.getPadre().getHijos().remove(nodoActual);
						panelDatos
								.onObjetoEntidad(((CarpetaTransaccion) nodoActual)
										.getPadre());
						activarOperacionCarpeta();
					}
				} else if (nodoActual instanceof Transaccion) {
					CarpetaTransaccion c = ((Transaccion) nodoActual)
							.getCarpeta();
					((Transaccion) nodoActual).getCarpeta().getTransacciones()
							.remove(nodoActual);
					panelDatos.onObjetoEntidad(c);
					activarOperacionCarpeta();
				}
				arbolSeguridad.setRaiz(raiz);

			}
			dialogo.salir();
		}
	};

	private void onEliminar(ActionEvent e) {
		// TODO Implement.
		// Se pregunta si se Desea eliminar el Nodo de su Padre
		String mensaje = "Esta Seguro de Eliminar el Nodo";
		dialogo = DialogoMensaje.mostrar("Eliminar", mensaje,
				TipoDialogo.CONFIRMACION, BotonesDialogo.SI_NO,
				manejadorEventoBoton);

	}

	private void activarOperacionCarpeta() {

		btnNuevo.setEnabled(true);
		btnEditar.setEnabled(true);
		btnEliminar.setEnabled(true);

	}

	private void activarOperacionTransaccion() {

		btnNuevo.setEnabled(false);
		btnEditar.setEnabled(true);
		btnEliminar.setEnabled(true);

	}

	private EjecutarListener eventoEjecutar = new EjecutarListener() {

		public void onClickCarpeta(CarpetaTransaccion carpeta) {
			// TODO Auto-generated method stub
			nodoActual = carpeta;
			padreActual = carpeta;
			panelDatos.onObjetoEntidad(carpeta);
			activarOperacionCarpeta();
		}

		public void onClickTransaccion(Transaccion transaccion) {
			// TODO Auto-generated method stub
			nodoActual = transaccion;
			panelDatos.onObjetoEntidad(transaccion);
			activarOperacionTransaccion();
		}

	};

	private ContentPane paneContenido;

	private Button btnNuevo;

	private Button btnEditar;

	private Button btnEliminar;

	private ArbolSeguridad arbolSeguridad;

	public PaneDatosBase getPanelDatos() {
		return panelDatos;
	}

	public void setPanelDatos(PaneDatosBase panelDatos) {
		this.panelDatos = panelDatos;

		// DisplayLayoutData layoutData = new DisplayLayoutData();
		// layoutData.setHeight(new ExtentEx("100%"));
		// layoutData.setWidth(new ExtentEx("100%"));
		//
		// panelDatos.setLayoutData(layoutData);
		this.paneContenido.add(panelDatos);
		this.panelDatos.addPaneDatosListener(eventoPaneDatos);
	}

	/**
	 * Configures initial state of component. WARNING: AUTO-GENERATED METHOD.
	 * Contents will be overwritten.
	 */
	private void initComponents() {
		this.setBackground(new Color(0xFFFFFF));
		SplitPane splitPane1 = new SplitPane();
		splitPane1.setSeparatorPosition(new Extent(200, Extent.PX));
		add(splitPane1);
		ContentPane contentPane2 = new ContentPane();
		splitPane1.add(contentPane2);
		SplitPane splitPane2 = new SplitPane();
		splitPane2.setEnabled(true);
		splitPane2.setOrientation(SplitPane.ORIENTATION_VERTICAL_BOTTOM_TOP);
		splitPane2.setSeparatorPosition(new Extent(40, Extent.PX));
		contentPane2.add(splitPane2);
		Row row1 = new Row();
		SplitPaneLayoutData row1LayoutData = new SplitPaneLayoutData();
		row1LayoutData.setInsets(new Insets(new Extent(5, Extent.PX)));
		row1LayoutData.setAlignment(new Alignment(Alignment.RIGHT,
				Alignment.DEFAULT));
		row1.setLayoutData(row1LayoutData);
		splitPane2.add(row1);
		btnNuevo = new Button();
		ResourceImageReference imageReference1 = new ResourceImageReference(
				"/com/obelisco/vista/resource/image/icon/buttons/incluir_desactivado.png");
		btnNuevo.setDisabledIcon(imageReference1);
		btnNuevo.setEnabled(false);
		ResourceImageReference imageReference2 = new ResourceImageReference(
				"/com/obelisco/vista/resource/image/icon/buttons/incluir.png");
		btnNuevo.setIcon(imageReference2);
		RowLayoutData btnNuevoLayoutData = new RowLayoutData();
		btnNuevoLayoutData.setInsets(new Insets(new Extent(5, Extent.PX),
				new Extent(0, Extent.PX)));
		btnNuevo.setLayoutData(btnNuevoLayoutData);
		btnNuevo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onIncluir(e);
			}
		});
		row1.add(btnNuevo);
		btnEditar = new Button();
		ResourceImageReference imageReference3 = new ResourceImageReference(
				"/com/obelisco/vista/resource/image/icon/buttons/editar_desactivado.png");
		btnEditar.setDisabledIcon(imageReference3);
		btnEditar.setEnabled(false);
		ResourceImageReference imageReference4 = new ResourceImageReference(
				"/com/obelisco/vista/resource/image/icon/buttons/editar.png");
		btnEditar.setIcon(imageReference4);
		RowLayoutData btnEditarLayoutData = new RowLayoutData();
		btnEditarLayoutData.setInsets(new Insets(new Extent(5, Extent.PX),
				new Extent(0, Extent.PX)));
		btnEditar.setLayoutData(btnEditarLayoutData);
		btnEditar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onEditar(e);
			}
		});
		row1.add(btnEditar);
		btnEliminar = new Button();
		ResourceImageReference imageReference5 = new ResourceImageReference(
				"/com/obelisco/vista/resource/image/icon/buttons/eliminar_desactivado.png");
		btnEliminar.setDisabledIcon(imageReference5);
		btnEliminar.setEnabled(false);
		ResourceImageReference imageReference6 = new ResourceImageReference(
				"/com/obelisco/vista/resource/image/icon/buttons/eliminar.png");
		btnEliminar.setIcon(imageReference6);
		RowLayoutData btnEliminarLayoutData = new RowLayoutData();
		btnEliminarLayoutData.setInsets(new Insets(new Extent(5, Extent.PX),
				new Extent(0, Extent.PX)));
		btnEliminar.setLayoutData(btnEliminarLayoutData);
		btnEliminar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				onEliminar(e);
			}
		});
		row1.add(btnEliminar);
		arbolSeguridad = new ArbolSeguridad();
		arbolSeguridad.setInsets(new Insets(new Extent(5, Extent.PX)));
		splitPane2.add(arbolSeguridad);
		paneContenido = new ContentPane();
		splitPane1.add(paneContenido);
	}

	public void onListaParametros(List arg0) {
		// TODO Auto-generated method stub
		
	}

	public Object onBuscarObjetoEntidad() {
		// TODO Auto-generated method stub
		return null;
	}

}
